package OBSXML;
import Errorhandler.ErrorLogger;
import java.io.File;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;

/**
 * Documentation http://www.java-tips.org/java-se-tips/javax.xml.validation/how-to-create-xml-validator-from-xml-s.html
 * Validerer en xml fil mod et xml schema.
 * 
 * Evt. fejl skrives til error log. Dog kan der opstå en fejl der ikke kan
 * logges hvis der ikke er skriverettighed til log bibliotektet. Det er
 * Organisators driftafdelings opgave at sikre at der til enhver tid er skrive-
 * rettighed til log biblioteket. Alternativ kan der skrives til OS event log,
 * det rette sted at angive den kode er markeret med kommentaren
 * SKRIV_TIL_OS_EVENT_LOG. Organisators drift afdeling vælger selv hvilken
 * løsning de foretrækker og står selv for en eventuel implementering.
 * @author Jesper Wistoft
 */
public class XMLValidator {
    private String logDir = System.getProperty("user.dir") + File.separator+"log"+File.separator;
    private String logName = "XMLValidatorError.log";

    // angiv type af XML-skema
    private String schemaType = "http://www.w3.org/2001/XMLSchema";
    // hent skema compiler
    private SchemaFactory schemaFact = SchemaFactory.newInstance(schemaType);

     /**
     * @param xmlPath sti til xml fil der ønskes valideret
     * @param xsdPath sti til xml schema der skal bruge til validering
     */
    public boolean XMLValidator (String xmlPath, String xsdPath) {

        boolean isValid = true;
        try {
            // indlæs skema fra fra fil
            Schema rapportSchema = schemaFact.newSchema(new StreamSource(xsdPath));
            //tilknyt validator
            Validator validator = rapportSchema.newValidator();
            //udfør validering
            validator.validate(new StreamSource(xmlPath));
        } catch (SAXException ex) {
            try {
                ErrorLogger.writeToErrorLog(logDir+logName,"Fejl i XML: " +xmlPath+ ": " +ex.getMessage()+ "\n");
                isValid = false;
            } catch (Exception ex1){} // fejl hvis der ikke kan skrives til log kan ikke håndteres, SKRIV_TIL_OS_EVENT_LOG
        } catch (Exception ex) {
            try {
                ErrorLogger.writeToErrorLog(logDir+logName,"XML validering kunne ikke startes: "+ex.getMessage());
            } catch (Exception ex1){} // fejl hvis der ikke kan skrives til log kan ikke håndteres, SKRIV_TIL_OS_EVENT_LOG
        }
        return isValid;
    }
}


